﻿using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace WenSkin.Controls
{
    public class WenControl : Control
    {
        public WenControl()
        {
            base.SetStyle(
                ControlStyles.UserPaint |
                ControlStyles.DoubleBuffer |
                ControlStyles.OptimizedDoubleBuffer |
                ControlStyles.AllPaintingInWmPaint |
                ControlStyles.ResizeRedraw |
                ControlStyles.SupportsTransparentBackColor, true);
            base.UpdateStyles();
            this.BackColor = Color.Transparent;
        }

        #region 私有属性

        private Color customForeColor = Color.White;
        private bool autoReverseForeColorColor;
        private Color backColor = Color.Transparent;
        private Color foreColor = Color.White;
        #endregion

        #region 公有属性

        [Category("Wen")]
        [Description("当前用户控件信息")]
        [Bindable(true)]
        [Browsable(true)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        [EditorBrowsable(EditorBrowsableState.Always)]
        public override string Text { get => base.Text; set => base.Text = value; }

        [Browsable(false)]
        public Color CustomForeColor
        {
            get => customForeColor;
            set
            {
                customForeColor = value;
                base.ForeColor = value;
                this.Invalidate();
            }
        }

        [Category("WenAuto"), Description("颜色是否自动反色"), DefaultValue(false)]
        public bool AutoReverseForeColorColor
        {
            get => autoReverseForeColorColor;
            set { autoReverseForeColorColor = value; this.Invalidate(); }
        }

        [DefaultValue(typeof(Color), "White"), Category("WenColor"), Description("前景色")]
        public override Color ForeColor
        {
            get => foreColor;
            set
            {
                foreColor = value;
                base.ForeColor = value;
                this.Invalidate();
            }
        }

        [DefaultValue(typeof(Color), "Transparent"), Category("WenColor"), Description("背景色")]
        public override Color BackColor
        {
            get => this.backColor;
            set
            {
                //若为系统颜色改为酷黑色
                if (value == System.Drawing.SystemColors.Control)
                {
                    value = Color.Transparent;
                }
                base.BackColor = value;
                this.backColor = value;
                this.Invalidate();
            }
        }

        #endregion

        #region 重绘


        /// <summary>
        /// 自定义绘制窗体
        /// </summary>
        /// <param name="e"></param>
        protected override void OnPaint(PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.SmoothingMode = SmoothingMode.AntiAlias;  //使绘图质量最高，即消除锯齿
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.CompositingQuality = CompositingQuality.HighQuality;

            Rectangle rec = this.ClientRectangle;
            WenOnPaint(g, rec, e);

            base.OnPaint(e);
        }

        protected virtual void WenOnPaint(Graphics g, Rectangle rec, PaintEventArgs e)
        {
        }

        #endregion

        #region 绘制文字
        /// <summary>
        /// 绘制文字上下居中靠左
        /// </summary>
        /// <param name="s"></param>
        /// <param name="g"></param>
        /// <param name="rec"></param>
        public void DrawString(string s, Graphics g, RectangleF rec)
        {
            DrawString(s, g, rec, StringAlignment.Near);
        }
        /// <summary>
        /// 绘制文字上下居中 需要指定水平方向
        /// </summary>
        /// <param name="s"></param>
        /// <param name="g"></param>
        /// <param name="rec"></param>
        /// <param name="stringAlignment"></param>
        public void DrawString(string s, Graphics g, RectangleF rec, StringAlignment stringAlignment)
        {
            g.DrawString(s, this.Font, new SolidBrush(this.ForeColor), rec, new StringFormat(StringFormatFlags.NoClip | StringFormatFlags.NoWrap)
            {
                LineAlignment = StringAlignment.Center,
                Alignment = stringAlignment,
                Trimming = StringTrimming.EllipsisCharacter
            });
        }


        #endregion

        #region 消息提示框
        /// <summary>
        /// 消息
        /// </summary>
        /// <param name="text"></param>
        /// <returns></returns>
        public bool MsgBoxInformation(string text)
        {
            var m = new MsgBox(text, MsgBox.MsgBoxIcon.Info).ShowDialog();
            if (m == DialogResult.OK)
                return true;
            else
                return false;
        }
        /// <summary>
        /// 提醒
        /// </summary>
        /// <param name="text"></param>
        /// <returns></returns>
        public bool MsgBoxAsterisk(string text)
        {
            var m = new MsgBox(text, MsgBox.MsgBoxIcon.Asterisk).ShowDialog();
            if (m == DialogResult.OK)
                return true;
            else
                return false;
        }
        /// <summary>
        /// 警告
        /// </summary>
        /// <param name="text"></param>
        /// <returns></returns>
        public bool MsgBoxWarning(string text)
        {
            var m = new MsgBox(text, MsgBox.MsgBoxIcon.Warning).ShowDialog();
            if (m == DialogResult.OK)
                return true;
            else
                return false;
        }
        /// <summary>
        /// 错误
        /// </summary>
        /// <param name="text"></param>
        /// <returns></returns>
        public bool MsgBoxError(string text)
        {
            var m = new MsgBox(text, MsgBox.MsgBoxIcon.Error).ShowDialog();
            if (m == DialogResult.OK)
                return true;
            else
                return false;
        }
        #endregion

        #region 前景色自动反色
        protected override void OnBackColorChanged(EventArgs e)
        {
            base.OnBackColorChanged(e);
            if (AutoReverseForeColorColor)
            {
                Color color = this.BackColor;
                //颜色反色
                this.ForeColor = ControlHelper.ColorReverse(color);
                //当颜色为透明时候 ，前景色改为默认前景色不改变
                if (BackColor == Color.Transparent)
                    this.ForeColor = CustomForeColor;
            }
        }
        #endregion
    }
}
